<?php

namespace app\datacollect\common;

use think\Log;


class DataToFile
{
    /**
     * 实例
     * @var null
     */
    private static $instance = null;

    /**
     * app写入文件路径
     * @var null
     */
    private $path_app = null;

    /**
     * js写入文件路径
     * @var null
     */
    private $path_js = null;

    /**
     * app文件操作实例
     * @var null
     */
    private $file_handler_app = null;

    /**
     * js文件操作实例
     * @var null
     */
    private $file_handler_js = null;

    /**
     * 埋点日志是否以小时分隔
     * @var bool
     */
    private $is_log_sep_by_hour = false;

    /**
     * 获取实例
     * @return DataToFile|null
     */
    public static function getInstance(): ?DataToFile
    {
        if (is_null(self::$instance))
        {
            self::$instance = new self();
            $conf_sink = config('conf_sink');
            self::$instance->path_app = $conf_sink['path_app'];
            self::$instance->path_js = $conf_sink['path_js'];
            self::$instance->is_log_sep_by_hour = $conf_sink['is_log_sep_by_hour'];

            //app采集埋点数据，创建文件夹
            if (empty(self::$instance->path_app))
            {//没有配置埋点文件路径
                Log::write('app埋点日志采集写入文件失败：路径为空', 'error', true);
            } else
            {//检查目录是否存在
                if (!is_dir(self::$instance->path_app))
                {//不存在，那么创建文件夹
                    mkdir(self::$instance->path_app, 0755, true);
                }
            }

            //js采集埋点数据，创建文件夹
            if (empty(self::$instance->path_js))
            {//没有配置埋点文件路径
                Log::write('js埋点日志采集写入文件失败：路径为空', 'error', true);
            } else
            {//检查目录是否存在
                if (!is_dir(self::$instance->path_js))
                {//不存在，那么创建文件夹
                    mkdir(self::$instance->path_js, 0755, true);
                }
            }
        }
        return self::$instance;
    }


    /**
     * 日志打点
     * @param mixed $data 数据【web打点：$data是单条数据；app打点：$data是多条数据】
     * @param bool $is_js 是否是web打点【true：web打点；false：app打点；】
     */
    public function writeToFile($data, $is_js = false)
    {

        if (empty($data))
        {
            Log::write('埋点日志采集写入文件失败：数据为空', 'error', true);
            return;
        }

        if ($is_js)
        {//js打点
            if (is_null(self::$instance->file_handler_js))
            {
                self::$instance->file_handler_js = fopen($this->path_js . 'collect_log.' . (self::$instance->is_log_sep_by_hour ? date('Ymd-H') : date('Ymd')), 'a+');
            }
            $is_write_success = fwrite(self::$instance->file_handler_js, $data . "\n");
            if (false === $is_write_success)
            {
                Log::write('web埋点日志采集写入文件失败：写入失败', 'error', true);
            }
            if (!is_null(self::$instance->file_handler_js))
            {
                fclose(self::$instance->file_handler_js);
            }
        } else
        {//app打点
            if (is_null(self::$instance->file_handler_app))
            {
                self::$instance->file_handler_app = fopen($this->path_app . 'collect_log.' . (self::$instance->is_log_sep_by_hour ? date('Ymd-H') : date('Ymd')), 'a+');
            }
            foreach ($data as $v)
            {
                $is_write_success = fwrite(self::$instance->file_handler_app, json_encode($v) . "\n");
                if (false === $is_write_success)
                {
                    Log::write('app埋点日志采集写入文件失败：写入失败', 'error', true);
                }
            }
            if (!is_null(self::$instance->file_handler_app))
            {
                fclose(self::$instance->file_handler_app);
            }
        }


    }
}

